/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package remote;

import entity.vFile;
import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

/**
 *
 * @author Nuno
 */
public class ftp {
    private String location;
    private String username;
    private String password;

    private String URL;

    private FTPClient ftpc;



    public ftp(String URL, String location, String username, String password){
        this.URL = URL;
        this.location = location;
        this.username = username;
        this.password = password;
    }

        /**
     * Metodo para efectuar a ligação a um servidor FTP
     * @return Valor boolean - true se ligado com sucesso, false qualquer outro caso.
     */
    public boolean connect() throws SocketException, IOException{
        ftpc  = new FTPClient();
        ftpc.connect(URL);
       
       if (!ftpc.login(username, password))
            return false;
        ftpc.enterLocalPassiveMode();
        if (!ftpc.changeWorkingDirectory(location))
            return false;

        ftpc.setFileType(FTP.BINARY_FILE_TYPE);

        return true;
    }
        /**
     * Metodo para efectuar o download do ficheiro de um servidor NFS
     * @param fout - Destino para o ficheiro
     * @return Valor boolean - true se copiado com sucesso, false qualquer outro caso.
     */
       /**
     * Metodo para desligar a ligação ao servidor FTP
     * @return Valor boolean - true se desligado com sucesso, false qualquer outro caso.
     */
    public boolean disconnect() throws IOException{
        if (!ftpc.logout())
            return false;
        ftpc.disconnect();
        return true;
    }

       /**
     * Metodo para obter o conteudo da pasta actual no servidor FTP
     * @return Valor do tipo Folder
     */
    public synchronized Folder getContent() throws IOException{

        Folder fold = new Folder("/");
        rFile rfile;
         FTPFile ff[] = ftpc.listFiles();
         
         if(ff.length>0)
         for(int i=0; i< ff.length;i++){
             System.out.println(ff[i].getName());

            if(ff[i].isDirectory()){
                fold.addFolder(getContent(ff[i].getName()));
            }
            else if(ff[i].isFile()){
                rfile = new rFile(ff[i].getName());
                fold.addFile(rfile);
            }
             
         }

        return fold;
    }
     /**
     * Metodo para obter o conteudo da pasta actual no servidor FTP
     * @param path - Caminho para o conteudo (caso subdirectorias)
     * @return Valor do tipo Folder
     */
    public synchronized Folder getContent(String path) throws IOException{

        Folder fold = new Folder(path.substring(path.lastIndexOf("/")+1, path.length()));
        rFile rfile;
         FTPFile ff[] = ftpc.listFiles(path);

         if(ff.length>0)
         for(int i=0; i< ff.length;i++){
             System.out.println(ff[i].getName());
            if(ff[i].isDirectory()){
                fold.addFolder(getContent(path+"/"+ff[i].getName()));
            }
            else if(ff[i].isFile()){
                rfile = new rFile(ff[i].getName());
                fold.addFile(rfile);
            }

         }

        return fold;
    }


public InputStream getIS(String filename) throws IOException{

   ByteArrayOutputStream out = new ByteArrayOutputStream();
    ftpc.retrieveFile(filename,out);
    return new ByteArrayInputStream(out.toByteArray());
}

    /**
     * Metodo para obter um ficheiro do servidor FTP
     * @param filename - Nome do ficheiro a obter
     * @return Nome do ficheiro
     */
    public synchronized String downloadFile(String filename) throws IOException{

        InputStream is = ftpc.retrieveFileStream(filename);
        BufferedInputStream bis = new BufferedInputStream(is);

        File f = new File(filename);
        int i=1, ind;

        ind = filename.lastIndexOf(".");

        String eFilename = filename;
        while(f.exists()){

            eFilename = filename.substring(0, ind) + "(" + i + ")." + filename.substring(ind+1, filename.length());
            f=new File(eFilename);
            i++;
        }

      OutputStream os = new FileOutputStream( eFilename);
      BufferedOutputStream bos = new BufferedOutputStream(os);

      byte[] buffer = new byte[1024];
      int readCount;

      while( (readCount = bis.read(buffer)) > 0)
      {
        bos.write(buffer, 0, readCount);
      }
      bos.close();
      is.close (); // close the FTP inputstream
     // this.succMesg = "Downloaded!";
      
        return eFilename;
    }





}
